package com.itheima.utils;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
* 用于记录日志的工具类，它里面提供了公共的代码
*/
@Component("logger")
@Aspect
public class Logger {
    @Pointcut("execution(* com.itheima.service.Impl.*.*(..))")
    private void pt1(){}
    /**
     * 前置通知
     */
    @Before("pt1()")
    public void BeforePrintLog(){
        System.out.println("前置通知Logger类中的printLog方法开始记录日志");
    }
    /**
     * 后置通知
     */
    @AfterReturning("execution(* com.itheima.service.Impl.*.*(..))")
    public void AfterReturningPrintLog(){
        System.out.println("后置通知Logger类中的printLog方法开始记录日志");
    }
    /**
     * 异常通知
     */
    @AfterThrowing("execution(* com.itheima.service.Impl.*.*(..))")
    public void AfterThrowingPrintLog(){
        System.out.println("异常通知Logger类中的printLog方法开始记录日志");
    }
    /**
     * 最终通知
     */
    @After("execution(* com.itheima.service.Impl.*.*(..))")
    public void AfterPrintLog(){
        System.out.println("最终通知Logger类中的printLog方法开始记录日志");
    }
    /**
     * 环绕通知
     */
    //@Around("pt1()")
    public void aroundPringLog(ProceedingJoinPoint pjp){
        Object rtvalue = null;
        try {
            Object[] args = pjp.getArgs();
            System.out.println("前置通知Logger类中的printLog方法开始记录日志");
            rtvalue = pjp.proceed();
            System.out.println("后置通知Logger类中的printLog方法开始记录日志");
        } catch (Throwable throwable) {
            System.out.println("异常通知Logger类中的printLog方法开始记录日志");
            throwable.printStackTrace();
        } finally {
            System.out.println("最终通知Logger类中的printLog方法开始记录日志");
        }
    }
}
